package gui;

import controlleur.ControllerGrille;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.GridLayout;
import java.util.Observable;
import java.util.Observer;
import javax.swing.JOptionPane;
import moteur.Plateau;
import javax.swing.JPanel;

public class Grille extends JPanel implements Observer
{

    private Plateau plateau;
    private Case pion[][] = new Case[8][8];
    private static Grille instance = null;
    private Window win;

    private Grille()
    {
        //super(new GridLayout(8, 8,0,0));
        plateau = Plateau.getInstance();
        plateau.addObserver(this);


        drawPlateau();
        setLayout(new GridLayout(8, 8, 0, 0));
        setPreferredSize(new Dimension(200, 233));
    }

    public static Grille getInstance()
    {
        if (instance == null)
        { // Premier appel
            instance = new Grille();
        }
        return instance;
    }

    @Override
    public void paintComponent(Graphics g)
    {
        Dimension d = getSize();

        int width_height = Math.min(d.height, d.width);
        d.setSize(width_height, width_height);
        setSize(d);
    }

    /** Dessine le plateau 
     * Comprend a l'interieur les appels des Cases
     */
    public void drawPlateau()
    {
        char[][] tab = plateau.getTabPlateau();
        Case c = null;
        for (int i = 0; i < tab.length; i++)
        {
            for (int j = 0; j < tab[0].length; j++)
            {
                c = new Case(i, j);
                pion[i][j] = c;
                add(c);
            }
        }
    }

    public void update(Observable o, Object arg)
    {
        repaint();
        ControllerGrille cg = new ControllerGrille();
        if (!cg.jeuFini() && cg.rechercheCoups().size() <= 0)
        {
            String couleur = "Noir";
            if (plateau.tour == 'b')
            {
                couleur = "Blanc";
            }
            String message = "Le Joueur " + couleur + " passe son tour";
            JOptionPane.showConfirmDialog(null, message, "Informations Partie", JOptionPane.DEFAULT_OPTION);
            plateau.changeTour();

            /** XXX SUITE AU CHGT DE TOUR, REVERIFICATION SI LE JOUEUR D'APRES PEUT JOUER, SI NON ALORS LA PARTIE EST TERMINE
             * RESTE A PROUVER
             */
            if (!cg.jeuFini() && cg.rechercheCoups().size() <= 0)
            {
                String coul = "Noir";
                if (plateau.tour == 'b')
                {
                    coul = "Blanc";
                }
                String mess = "Le Joueur " + coul + " passe son tour";
                JOptionPane.showConfirmDialog(null, mess, "Informations Partie", JOptionPane.DEFAULT_OPTION);
                int scoreB = Plateau.getInstance().getScoreB();
                int scoreN = Plateau.getInstance().getScoreN();
                partiFini(scoreN, scoreB);
            }
        }
        plateau.jouerTour();
    }

    public Case[][] getPion()
    {
        return pion;
    }

    /* Fonction qui affiche la victoire et demande d'une nouvelle partie*/
    public void partiFini(int scoreN, int scoreB)
    {

        int res;
        if (scoreN < scoreB)
        {

            JOptionPane.showMessageDialog(null, "Victoire des Blancs " + scoreB + " - " + scoreN, "Fin de partie !", 1);
        }
        else if (scoreN > scoreB)
        {
            JOptionPane.showMessageDialog(null, "Victoire des Noirs " + scoreN + " - " + scoreB, "Fin de partie !", 1);
        }
        else
        {
            JOptionPane.showMessageDialog(null, "Match Nul ! " + scoreN + " - " + scoreB, "Fin de partie !", 1);
        }

        res = JOptionPane.showConfirmDialog(null, "Voulez vous rejouer ?", "Nouvelle Partie ?", JOptionPane.YES_NO_OPTION);
        if (res == JOptionPane.YES_OPTION)
        {
        }
    }

    public static void reset()
    {
        instance = null;
    }
}
